最近在项目测试的时候发现一个问题,getsockname接口获取的IP地址在有些机器上是真正的IP地址例如192.168.2.207,有些机器获取出来的是127.0.0.1这个地址。 为什么会出现getsockname获取的是127.0.0.1这个问题,我认真去探究了一下。 部分代码如下:
//等待处理
while(1)
{
//等待client端的连接
newFd=accept(sockfd,(struct sockaddr *)&from,&len);
if(newFd==-1) continue;
getsockname(newFd, (struct sockaddr *)&addr, &len);
//getsockname(sockfd, (struct sockaddr *)&addr, &len);
ptr = inet_ntoa(addr.sin_addr);
printf("%s:%d", ptr, htons(addr.sin_port));
。。。。。
}
场景说明:在测试的时候,服务器和客户端不在同一电脑,获取IP的真实网卡IP,在同一台电脑就是127.0.0.1 原因分析:如果你的客户端和服务端在同一台机器上,那么你的数据交互就不涉及真实IP地址,只是经过本机而已,所以拿到的地址就是127.0.0.1。不在同一电脑,那么他们数据交互肯定是经过真实IP地址的,所以通过socket拿到的IP就是真实的 PS:只针对我这个情况作了分析,其它情况不一定适用~ getsockname函数是要对accept返回值使用, 不是进行listen或bind的那个socket,如我上面的代码: 是getsockname(newFd, (struct sockaddr *)&addr, &len);//newFd,accept返回值 而不是getsockname(sockfd, (struct sockaddr *)&addr, &len);//sockfd
|